{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy import *\n",
    "\n",
    "def loadDataSet(filename):\n",
    "\tnumFeat = len(open(filename).readline().split('\\t')) - 1\n",
    "\tdataMat = []\n",
    "\tlabelMat = []\n",
    "\tfr = open(filename)\n",
    "\tfor line in fr.readlines():\n",
    "\t\tlineArr = []\n",
    "\t\tcurLine = line.strip().split('\\t')\n",
    "\t\tfor i in range(numFeat):\n",
    "\t\t\tlineArr.append(float(curLine[i]))\n",
    "\t\tdataMat.append(lineArr)\n",
    "\t\tlabelMat.append(float(curLine[-1]))\n",
    "\treturn dataMat, labelMat\n",
    "\n",
    "#computes the best-fit line\n",
    "def standRegres(xArr, yArr):\n",
    "\txMat = mat(xArr)\n",
    "\tyMat = mat(yArr).T\n",
    "\txTx = xMat.T * xMat\n",
    "\tif linalg.det(xTx) == 0.0:#check if the determinate is zero\n",
    "\t\tprint(\"This matrix is singular, cannot do inverse\")\n",
    "\t\treturn \n",
    "\tws = xTx.I * (xMat.T * yMat)\n",
    "\treturn ws\n",
    "\n",
    "#Locally weighted linear regression function\n",
    "#to generate a yHat estimate for any point in the x space\n",
    "#function lwlr: input the testpoint\n",
    "#function lwlrTest: get the yHat\n",
    "def lwlr(testPoint, xArr, yArr, k = 1.0):\n",
    "\txMat = mat(xArr); yMat = mat(yArr).T\n",
    "\tm = shape(xMat)[0]\n",
    "\tweights = mat(eye((m)))#diagonal matrix\n",
    "\tfor j in range(m):\n",
    "\t\tdiffMat = testPoint - xMat[j,:]\n",
    "\t\tweights[j,j] = exp(diffMat * diffMat.T / (-2.0 * k ** 2))# populate weights with exponentially decaying values\n",
    "\txTx = xMat.T * (weights * xMat)\n",
    "\tif linalg.det(xTx) == 0.0:\n",
    "\t\tprint(\"This matrix is singular, cannot do inverse\")\n",
    "\t\treturn \n",
    "\tws = xTx.I * (xMat.T * (weights * yMat))\n",
    "\treturn testPoint * ws\n",
    "\n",
    "def lwlrTest(testArr, xArr, yArr, k = 1.0):\n",
    "\tm = shape(testArr)[0]\n",
    "\tyHat = zeros(m)\n",
    "\tfor i in range(m):\n",
    "\t\tyHat[i] = lwlr(testArr[i], xArr, yArr, k)\n",
    "\treturn yHat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[1.0, 0.067732], [1.0, 0.42781]]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xArr,yArr = loadDataSet('E:\\python\\machinelearning\\MLDownloads\\machinelearninginaction\\Ch08\\ex0.txt')\n",
    "xArr[0:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.176513"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yArr[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[3.12204471]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lwlr(xArr[0],xArr,yArr,1.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[3.17647975]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lwlr(xArr[0],xArr,yArr,0.0001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.2020066489821457"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yHat = lwlrTest(xArr,xArr,yArr,0.003)\n",
    "yHat[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "xMat = mat(xArr)\n",
    "srtInd = xMat[:,1].argsort(0)\n",
    "xSort = xMat[srtInd][:,0,:]\n",
    "import matplotlib.pyplot as plt \n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0], s = 2, c = 'green')\n",
    "ax.plot(xSort[:,1], yHat[srtInd])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "yHat = lwlrTest(xArr,xArr,yArr,0.01)\n",
    "ax = fig.add_subplot(111)\n",
    "ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0], s = 2, c = 'red')\n",
    "ax.plot(xSort[:,1], yHat[srtInd])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "yHat = lwlrTest(xArr,xArr,yArr,1)\n",
    "ax = fig.add_subplot(111)\n",
    "ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0], s = 2, c = 'blue')\n",
    "ax.plot(xSort[:,1], yHat[srtInd])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rssError(yArr, yHatArr):\n",
    "    return((yArr - yHatArr) ** 2).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "abX, abY = loadDataSet('E:\\\\python\\\\machinelearning\\\\MLDownloads\\\\machinelearninginaction\\\\Ch08\\\\abalone.txt')\n",
    "yHat01 = lwlrTest(abX[0:999],abX[0:999],abY[0:999],0.1)\n",
    "yHat1 = lwlrTest(abX[0:99],abX[0:99],abY[0:99],1)\n",
    "yHat10 = lwlrTest(abX[0:99],abX[0:99],abY[0:99],10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12311.663234486785"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rssError(abY[0:999],yHat01.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "429.89056187030394"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rssError(abY[0:99],yHat1.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "549.1181708826065"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rssError(abY[0:99],yHat10.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25119.459111157415"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yHat01 = lwlrTest(abX[100:199],abX[0:99],abY[0:99],0.1)\n",
    "rssError(abY[100:199],yHat01.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "573.5261441895706"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yHat1 = lwlrTest(abX[100:199],abX[0:99],abY[0:99],1)\n",
    "rssError(abY[100:199],yHat1.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "517.5711905381745"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yHat10 = lwlrTest(abX[100:199],abX[0:99],abY[0:99],10)\n",
    "rssError(abY[100:199],yHat10.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "518.6363153249365"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ws = standRegres(abX[0:99],abY[0:99])\n",
    "yHat = mat(abX[100:199]) * ws\n",
    "rssError(abY[100:199],yHat.T.A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ridgeRegres(xMat, yMat, lam = 0.2):\n",
    "    xTx = xMat.T * xMat\n",
    "    denom = xTx + eye(shape(xMat)[1]) * lam\n",
    "    if linalg.det(denom) == 0.0:\n",
    "        print(\"This matrix is singular, cannot do inverse\")\n",
    "        return\n",
    "    ws = denom.I * (xMat.T * yMat)\n",
    "    return ws\n",
    "\n",
    "def ridgeTest(xArr, yArr):\n",
    "    xMat = mat(xArr); yMat = mat(yArr).T\n",
    "    yMean = mean(yMat, 0)\n",
    "    yMat = yMat - yMean\n",
    "    xMeans = mean(xMat, 0)\n",
    "    xVar = var(xMat, 0)\n",
    "    xMat = (xMat - xMeans) /  xVar\n",
    "    numTestPts = 30\n",
    "    wMat = zeros((numTestPts,shape(xMat)[1]))\n",
    "    for i in range(numTestPts):\n",
    "        ws = ridgeRegres(xMat, yMat, exp(i - 10))\n",
    "        wMat[i,:] = ws.T\n",
    "    return wMat\n",
    "                 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "abX, abY = loadDataSet('E:\\\\python\\\\machinelearning\\\\MLDownloads\\\\machinelearninginaction\\\\Ch08\\\\abalone.txt')\n",
    "ridgeWeight = ridgeTest(abX,abY)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "yHat = lwlrTest(xArr,xArr,yArr,1)\n",
    "ax = fig.add_subplot(111)\n",
    "#ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0], s = 2, c = 'blue')\n",
    "ax.plot(ridgeWeight)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
